perm filename M[AP,SYS] blob sn#095774 filedate 1974-04-08 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions.
C00005 00003	Start of program: main loop.
C00007 00004	TOTS
C00010 00005	PRNTNO  NXTDG
C00011 00006	START   RESTAR  STOPIT
C00013 00007	INITAP
C00018 00008	PERCNT
C00020 00009	DOTIM
C00023 00010	FIXUP
C00029 ENDMK
C⊗;
;Definitions.

	TITLE	M

↓C   ←1
↓CHAR←2
↓AC1 ←3
↓BOT ←4
↓CNT ←5
↓QUO ←6
↓REM ←7
↓DX  ←10
↓BOT ←11
↓BP  ←12
↓CHR ←13
↓CMD ←14
↓A   ←15
↓B   ←16
↓P   ←17

↓CR←←15  ↓LF←←12  ↓ALT←←175

PDLEN←30
↓NPNS←←1000

PDLIST:	BLOCK	PDLEN
NAME:	BLOCK	NPNS*2
COUNT←NAME+1
LTR:	BLOCK	=32

BLANKS:	ASCII	/     /
DIGITS:	BLOCK	4

USERSF:	SIXBIT	/USERS/
	BLOCK	3
IBUF:	BLOCK	3

UCMD:	IOWD	2,NAME+2
	0

WAKEBK:	SIXBIT	/[-AP-]/
	SIXBIT	/ APSYS/
	0

SWAPBK:	SIXBIT	/DSK/
	SIXBIT	/DOER/
	XWD	'DMP',14	;start DOER as a phamtom
	0
	SIXBIT	/ APSYS/
	SIXBIT	/ APSYS/

LLEN←10000
WLEN←6400
MAXDLN←10000

SPECS←←4
XSIZE←←3
MAXNBR←←=500
XLEN←MAXNBR*XSIZE+SPECS

DICT:	BLOCK	MAXDLN+3	;+1 WOULD PROBABLY DO
DCMD:	IOWD	1,DICT
	0
WORDS:	BLOCK	WLEN
WCMD:	IOWD	WLEN,WORDS
	0
LINKS:	BLOCK	LLEN
LCMD:	IOWD	LLEN,LINKS
	0
INDEX:	BLOCK	XLEN
XCMD:	IOWD	XLEN,INDEX
	0
DSK17:	17
	SIXBIT	/DSK/
	0
DICTF:	SIXBIT	/DICT/
	BLOCK	3
WORDSF:	SIXBIT	/WORDS/
	BLOCK	3
LINKSF:	SIXBIT	/LINKS/
	BLOCK	3
INDEXF:	SIXBIT	/INDEX/
	BLOCK	3
NEWSF:	SIXBIT	/NEWS/
	BLOCK	3

DEFINE NAMES {
	XXX START,START
	XXX STOP ,STOPIT
	XXX REST ,RESTAR
	XXX   PER,PERCNT
	XXX USERS,TOTS
	XXX INIT ,INITAP
	XXX  DOER,DOER
	XXX DOTIM,DOTIM
	XXX FIXUP,FIXUP
}

DEFINE XXX(A,B) {<ASCII \A\>}

DISNAM:	NAMES

DISLEN←←.-DISNAM

DEFINE XXX(A,B) {B}

DISTAB:	NAMES

DEFINE ERRMSG(A) {
	JRST	[OUTSTR	[ASCIZ \
A
\]
		RESET
		EXIT]
}
;Start of program: main loop.

FAILED:	OUTSTR	[ASCIZ /	FAILED!
/]

M:	RESET
	OUTSTR	[ASCIZ/
*/]
	MOVE	P,[IOWD PDLEN,PDLIST]
	MOVE	BP,[POINT 7,CMD]	;READ COMMAND IN AND SAVE IT IN CMD
	SETZ	CMD,
	MOVEI	CNT,5			;COMMAND HAS AT MOST 5 CHARS
	JRST	GETCH
PUTCH:	SOJL	CNT,GETCH
	CAIL	CHR,"A"
	TRZ	CHR,40			;make upper case letter
	IDPB	CHR,BP
GETCH:	INCHWL	CHR
	CAIE	CHR,CR			;COMMAND SHOULD END WITH CRLF
	JRST	PUTCH
	INCHWL	CHR
	CAIE	CHR,LF
	JRST	BADCMD

	MOVEI	A,DISLEN-1		;GET LENGTH OF COMMAND TABLE
	CAMN	CMD,DISNAM(A)		;LOOK FOR COMMAND IN TABLE
	JRST	@DISTAB(A)		;GO EXECUTE THIS COMMAND
	SOJGE	A,.-2

BADCMD:	OUTSTR	[ASCIZ /
?ILLEGAL COMMAND
/]
	JRST	M
DONE:	OUTSTR	[ASCIZ /DONE/]
	EXIT
;TOTS

	BEGIN	TOTS
↑TOTS:	OUTSTR	[ASCIZ/

/]
	MOVEI	BOT,2
	SETZM	COUNT
	SETZM	NAME
	INIT	0,10
	SIXBIT	/DSK/
	IBUF
	HALT	.
	SETZM	USERSF+3
	LOOKUP	0,USERSF
	JRST	FAILED
GETNAM:	SOSG	IBUF+2
	IN	0,
	JRST	[ILDB AC1,IBUF+1	;GET PN
		 ILDB CNT,IBUF+1	;GET COUNT FIELD FOR THIS PN
		 SOS  IBUF+2
		 JUMPN AC1,FIND
		 JRST GETNAM]
	STATO	0,20000	
	HALT	.
	RELEAS	0,
EOF:	MOVNI	AC1,-2(BOT)
	HRLM	AC1,UCMD
	CAILE	BOT,2
	JRST	NNN
	OUTSTR	[ASCIZ /
NO USERS YET.
/]
	JRST	DONE

FIND:
	MOVE	DX,BOT
NEXT:	SUBI	DX,2
	CAME	AC1,NAME(DX)
	JUMPG	DX,NEXT
	JUMPN	CNT,.+2			;IS THE COUNT FIELD ZERO?
	MOVEI	CNT,1			;YES. IMPLICIT COUNT OF 1.
	ADDM	CNT,COUNT		;ADD TO TOTAL COUNT OF PNs
	JUMPLE	DX,INSERT
	ADDM	CNT,COUNT(DX)
	JRST	GETNAM
INSERT:	CAIL	BOT,2*NPNS
	JRST	[OUTSTR [ASCIZ / TOO MANY PNS.  /]
		 JRST	FAILED]
	MOVEM	AC1,NAME(BOT)
	MOVEM	CNT,COUNT(BOT)
	ADDI	BOT,2
	JRST	GETNAM

PRNTNX:	OUTSTR	NAME(BOT)
	MOVE	BP,[POINT 7,DIGITS]
	MOVE	QUO,COUNT(BOT)
	PUSHJ	P,NXTDG
	MOVEI	QUO,CR
	IDPB	QUO,BP
	MOVEI	QUO,LF
	IDPB	QUO,BP
	MOVEI	QUO,0
	IDPB	QUO,BP
	OUTSTR	BLANKS
NNN:	SUBI	BOT,2
	JUMPGE	BOT,PRNTNX
	INIT	0,17
	SIXBIT	/DSK/
	0
	HALT	.	
	SETZM	USERSF+1
	SETZM	USERSF+2
	SETZM	USERSF+3
	ENTER	0,USERSF
	JRST	[OUTSTR [ASCIZ /
No new file written.
/]
		 JRST FIN]
	OUT	0,UCMD
	JRST	FIN
	RELEAS	0,3
	OUTSTR	[ASCIZ /
OUT UUO failed for new file.
/]
	JRST	DONE
FIN:	RELEAS	0,
	JRST	DONE
	BEND
;PRNTNO  NXTDG

PRNTZR:	CAIGE	QUO,=10
	OUTCHR	["0"]		;PRINT LEADING ZERO
PRNTNO:	MOVE	BP,[POINT 7,DIGITS]
	PUSHJ	P,NXTDG
	SETZ	QUO,
	IDPB	QUO,BP
	OUTSTR	DIGITS
	POPJ	P,

NXTDG:	IDIVI	QUO,=10
	PUSH	P,REM
	SKIPE	QUO
	PUSHJ	P,NXTDG
	POP	P,QUO
	ADDI	QUO,60
	IDPB	QUO,BP
	POPJ	P,
;START   RESTAR  STOPIT

	BEGIN	STOPIT

↑START:	MOVEI	AC1,WAKEBK
	SETZM	WAKEBK+2	;set wakeup value to NOW
	WAKEME	AC1,
	JRST	FAILED
	JRST	DONE

↑RESTAR:SETOM	STARTUP#
	JRST	STOP1

REST2:	OUTSTR	[ASCIZ/STOPPED.../]
	MOVEI	AC1,=8
	SLEEP	AC1,
	OUTSTR	[ASCIZ/STARTING.../]
	JRST	START

↑STOPIT:SETZM	STARTUP
	MOVEI	AC1,WAKEBK
	SETOM	WAKEBK+2	;set wakeup value to NEVER
	WAKEME	AC1,
	JRST	FAILED

STOP1:	
	LEYPOS	-2000			;move line editor position off screen
	CTLV				;turn off duplexing
	OUTCHR	["."]
	INWAIT
	CTLV				;turn on duplexing
	LEYPOS				;replace line editor in standard position

	MOVE	BP,[POINT 7,LTR]
	MOVEI	CNT,5*=32
	JRST	LOACHR

STOCHR:	SOJLE	CNT,.+2
	IDPB	CHR,BP	

LOACHR:	INCHWL	CHR
	CAIE	CHR,ALT
	JRST	STOCHR

	SETZ	CHR,
	IDPB	CHR,BP
	MOVEI	A,DONE
	SKIPE	STARTUP
	MOVEI	A,REST2

TEST:	MAIL	5,[SIXBIT /[-AP-]/
		   LTR]
	JRST	FAILED
	JRST	(A)
	OUTSTR	[ASCIZ /
[-AP-] does not exist!
/]
	JRST	FAILED

	BEND	STOPIT
;INITAP

;Initialize AP system!  This should almost never be done!

	BEGIN	INITAP

ZERO:	0
AZERO:	IOWD	1,ZERO
	0

↑INITAP:
	SETZB	A,AC1
	GETPPN	A,
	DSKPPN	AC1,
	CAME	AC1,[' APSYS']
	JRST	INIT1
	CAME	A,[' APSYS']
	JRST	EXIST

;check to see if INDEX or NEWS file exists.  if either exists, forget it!

INIT1:	OPEN	0,DSK17
	JRST	DSFAIL
	SETZM	NEWSF+3
	LOOKUP	0,NEWSF
	JRST	.+2
	JRST	EXIST
	HRRZ	A,NEWSF+1	;get error code
	JUMPN	A,EXIST
	RELEAS	0,

	OPEN	1,DSK17
	JRST	DSFAIL
	SETZM	INDEXF+3
	LOOKUP	1,INDEXF
	JRST	.+2
	JRST	EXIST
	HRRZ	A,INDEXF+1	;get error code
	JUMPN	A,EXIST
	RELEAS	1,

	OUTSTR	[ASCIZ/
ARE YOU SURE YOU REALLY WANT TO RESTART THE WHOLE AP SYSTEM?? /]
	INCHRW	A
	CAIE	A,"Y"
	JRST	FAILED
	OUTSTR	[ASCIZ/
ARE YOU ABSOLUTELY POSITIVE THAT IT IS NECESSARY TO REINITIALIZE IT?? /]
	INCHRW	A
	CAIE	A,"Y"
	JRST	FAILED
	OUTSTR	[ASCIZ/
OK.  HERE GOES!!!!  and remember YOU ASKED FOR IT!
/]

;Create NEWS and INDEX files.
	OPEN	0,DSK17		;prepare to create new NEWS file
	JRST	DSFAIL
	SETZM	NEWSF+1
	SETZM	NEWSF+2
	SETZM	NEWSF+3
	OUTSTR	[ASCIZ /Making NEWS.../]
	ENTER	0,NEWSF		;create NEWS file
	JRST	[OUTSTR	[ASCIZ/ENTER FAILED ON: NEWS/]
		 JRST FAIL]
	OUT	0,AZERO		;write out 1 zero word in NEWS
	JRST	.+3
	OUTSTR	[ASCIZ/OUT UUO FAILED FOR: NEWS/]
	JRST	FAIL
	OPEN	1,DSK17		;prepare to create INDEX file
	JRST	DSFAIL
	SETZM	INDEXF+1
	SETZM	INDEXF+2
	SETZM	INDEXF+3
	OUTSTR	[ASCIZ/Making INDEX.../]
	ENTER	1,INDEXF	;INDEX file
	JRST	[OUTSTR[ASCIZ/ENTER FAILED ON: INDEX/]
		 JRST FAIL]
	MOVEI	A,XSIZE+SPECS	;initialize special ptrs
	MOVEM	A,INDEX		;UNDUN
	MOVEM	A,INDEX+1	;NEW
	MOVEI	A,SPECS
	MOVEM	A,INDEX+2	;OLD
	MOVE	A,[XWD 1,4000]
	MOVEM	A,INDEX+1+XSIZE+SPECS;initialize index information for NEW area
	MOVE	A,[XWD 10,4000]
	MOVEM	A,INDEX+1+SPECS	;initialize index information for OLD area
	OUT	1,XCMD		;write out INDEX file
	JRST	.+3
	OUTSTR	[ASCIZ/OUT UUO FAILED ON: INDEX/]
	JRST	FAIL
	RELEAS	1,		;INDEX file
	RELEAS	0,		;NEWS file
	OUTSTR	[ASCIZ/
NEWS and INDEX done.
Now starting up INITER.
/]
	MOVEI	A,[	SIXBIT/DSK/
			SIXBIT/INITER/
			SIXBIT/DMP/
			1	;start up INITER at 1 past starting address
			SIXBIT/ APSYS/]
	SWAP	A,		;SWAP in INITER
	OUTSTR	[ASCIZ/
CANT FIND INITER!!!
/]
	EXIT

EXIST:	OUTSTR	[ASCIZ/
AP SYSTEM CANNOT BE INITIALIZED AT THIS TIME!!!
/]
↑FAIL:	RESET
	EXIT
↑DSFAIL:OUTSTR	[ASCIZ/
OPEN FAILED ON DSK!!!
/]
	JRST	FAIL

	BEND	INITAP
;PERCNT

;Calculate amt of NEWS used up.


	BEGIN	PERCNT


↑PERCNT:
	OPEN	0,DSK17
	JRST	DSFAIL		
	SETZM	NEWSF+3
	LOOKUP	0,NEWSF
	JRST	[OUTSTR[ASCIZ/LOOKUP FAILED ON NEWS!/]
		JRST FAIL]
	RELEAS	0,
	HLRE	C,NEWSF+3
	MOVN	C,C

	OPEN	1,DSK17
	JRST	DSFAIL
	SETZM	INDEXF+3
	LOOKUP	1,INDEXF
	JRST	[OUTSTR[ASCIZ/LOOKUP FAILED ON INDEX!/]
		JRST FAIL]
	IN	1,XCMD
	JRST	PC1
	OUTSTR	[ASCIZ/IN UUO FAILED ON INDEX!/]
	JRST	FAIL
PC1:	RELEAS	1,
	MOVE	B,INDEX+1
	MOVE	QUO,INDEX+1(B)
	LSH	QUO,-13
	SUBI	QUO,200
	IMULI	QUO,=100
	IDIV	QUO,C
	PUSHJ	P,PRNTNO
	OUTSTR	[ASCIZ/% NEWS used
/]
	EXIT
	BEND	PERCNT

	BEGIN	DOER
↑DOER:	MOVEI	QUO,SWAPBK
	SWAP	QUO,
	OUTSTR	[ASCIZ\DOER started as job #\]
	PUSHJ	P,PRNTNO
	EXIT
	BEND	DOER
;DOTIM

DOTIM:	OPEN	1,DSK17
	JRST	DSFAIL	
	MOVE	A,[' APSYS']
	MOVEM	A,DOTIMF+3
	LOOKUP	1,DOTIMF
	JRST	FAIL
	IN	1,DTCMD		;READ IN DOER STATISTICS
	JRST	.+2
	HALT	FAIL
	RELEAS	1,
	OUTSTR	[ASCIZ\
DOER data since \]
	MOVE	A,DODAT		;GET TIME STATISTICS CLEARED
	PUSHJ	P,DAYTIM	; AND PRINT IT
	OUTSTR	[ASCIZ\
Total DOER time used:	\]
	MOVE	A,DODAT+1
	PUSHJ	P,PRTIME
	OUTSTR	[ASCIZ\	
Notification time used:	\]
	MOVE	A,DODAT+2
	PUSHJ	P,PRTIME
	EXIT

DODAT:	BLOCK	4
DTCMD:	IOWD	4,DODAT
	0
DOTIMF:	SIXBIT	\DOTIM\
	BLOCK	3

DAYTIM:	HLLM	A,(P)		;SAVE DATE ON STACK
	ANDI	A,-1		; AND ZERO IT IN A
	IDIVI	A,=60		;PUT SECONDS IN B, MINUTES IN A
	PUSH	P,B		;SAVE SECONDS
	IDIVI	A,=60		;PUT MINUTES IN B, HOURS IN A
	MOVE	QUO,A		;HOURS INTO QUO
	PUSHJ	P,PRNTZR
	OUTCHR	[":"]
	MOVE	QUO,B		;GET MINUTES INTO QUO
	PUSHJ	P,PRNTZR	;PRINT MINUTES WITH LEADING ZERO, IF LESS THAN 10
	OUTCHR	[":"]
	POP	P,QUO		;GET SECONDS
	PUSHJ	P,PRNTZR	;PRINT SECONDS WITH LEADING ZERO, IF LESS THAN 10
	OUTSTR	[ASCIZ\   \]
	HLRZ	A,(P)		;GET DATE BACK
	IDIVI	A,=31		;DAYS INTO B, MONTHS INTO A
	MOVEI	QUO,1(B)	;DAYS INTO QUO
	PUSHJ	P,PRNTNO
	OUTCHR	[" "]
	IDIVI	A,=12		;MONTHS INTO B, YEARS INTO A
	OUTSTR	MONTH(B)	;PRINT MONTH
	OUTCHR	[" "]
	MOVEI	QUO,=64(A)	;GET YEAR
	JRST	PRNTNO		;PRINT YEAR, AND RETURN

MONTH:	FOR MON IN (Jan,Feb,Mar,Apr,May,June,July,Aug,Sept,Oct,Nov,Dec)
	{ASCIZ\MON\
}

PRTIME:	IMULI	A,=60
	IDIVI	A,=1000		;CONVERT TO TICKS
	IDIVI	A,=60		;TICKS INTO B, SECS INTO A
	PUSH	P,B		;SAVE TICKS
	IDIVI	A,=60		;SECS INTO B, MINS INTO A
	PUSH	P,B		;SAVE SECS
	IDIVI	A,=60		;MINS INTO B, HOURS INTO A
	MOVE	QUO,A
	PUSHJ	P,PRNTZR	;PRINT HOURS
	OUTCHR	[":"]
	MOVE	QUO,B
	PUSHJ	P,PRNTZR	;PRINT MINUTES
	OUTCHR	[":"]
	POP	P,QUO
	PUSHJ	P,PRNTZR	;PRINT SECS
	OUTCHR	[":"]
	POP	P,QUO
	JRST	PRNTZR		;PRINT SECS AND RETURN
;FIXUP

FIXUP:	OUTSTR	[ASCIZ/
ARE YOU SURE YOU WANT TO UNCATAGORIZE ALL STORIES?? /]
	INCHRW	A
	ANDI	A,137			;CONVERT RESPONSE TO UPPER CASE
	CLRBFI
	CAIE	A,"Y"
	JRST	FAILED
	OUTSTR	[ASCIZ/
OK.  Here we go.
/]
	OPEN	1,DSK17
	JRST	DSFAIL
	SETZM	INDEXF+1
	SETZM	INDEXF+2
	SETZM	INDEXF+3
	ENTER	1,INDEXF
	ERRMSG	{ENTER FAILED: INDEX}

	OPEN	0,DSK17
	JRST	DSFAIL

	SETZM	WORDSF+3
	LOOKUP	0,WORDSF
	ERRMSG	{LOOKUP FAILED: WORDS}
	IN	0,WCMD
	JRST	.+2
	ERRMSG	{IN UUO FAILED: WORDS}

	SETZM	INDEXF+3
	LOOKUP	0,INDEXF
	ERRMSG	{LOOKUP FAILED: INDEX}
	IN	0,XCMD
	JRST	.+2
	ERRMSG	{IN UUO FAILED: INDEX}

	SETZM	DICT
	MOVE	A,[DICT,,DICT+1]
	BLT	A,DICT+MAXDLN		;MUST ZERO A WORD BEYOND END OF DICT!
	SETZM	DICTF+3
	LOOKUP	0,DICTF
	ERRMSG	{LOOKUP FAILED: DICT}
	HLRE	A,DICTF+3
	JUMPL	A,.+2
	ERRMSG	{ZERO WORD COUNT: DICT}
	CAMGE	A,[-MAXDLN]
	ERRMSG	{FILE TOO BIG: DICT}
	HRLM	A,DCMD
	IN	0,DCMD
	JRST	.+2
	ERRMSG	{IN UUO FAILED: DICT}

	MOVSI	C,(<ASCIZ /?/>)
	MOVEI	A,2
CLRDCT:	HLRZ	B,DICT(A)
	CAMN	C,WORDS(B)
	JRST	CLRMLT
	HRRZ	DX,DICT+1(A)		;IS THIS A LEGAL KEYWORD?
	CAIE	DX,-1
	HLLZS	DICT+1(A)		;YES.  ZERO ITS PTR INTO LINKS
	ADDI	A,2
	JRST	CLRDCT
CLRMLT:	TRO	A,177
	ADDI	A,1
	HLRZ	B,DICT(A)		;PICK UP PTR INTO WORDS
	JUMPE	B,CLINKS		;ZERO MEANS END OF DICTIONARY
CLRML1:	HRRZ	DX,DICT+1(A)		;IS THIS A LEGAL KEYWORD?
	CAIE	DX,-1
	HLLZS	DICT+1(A)		;YES.  ZERO ITS PTR INTO LINKS
	ADDI	A,3			;ADVANCE TO NEXT MULT WORD ENTRY
	HLRZ	B,DICT(A)		;PICK UP PTR INTO WORDS
	JUMPN	B,CLRML1
	JRST	CLRMLT			;A ZERO WORD PTR MEANS END OF RECORD
CLINKS:	SETZM	LINKS
	MOVE	A,[LINKS,,LINKS+1]
	BLT	A,LINKS+LLEN-1
	MOVEI	A,2
	MOVEM	A,LINKS-2(A)
	ADDI	A,2
	CAIGE	A,LLEN
	JRST	.-3

	MOVEI	A,SPECS
	HRRZS	INDEX(A)
	ADDI	A,XSIZE
	CAIGE	A,XLEN
	JRST	.-3

	OUTSTR	[ASCIZ /
DELETE ALL STORIES? /]
	INCHRW	A
	OUTSTR	[ASCIZ /
/]
	ANDI	A,137			;CONVERT RESPONSE TO UPPER CASE
	CLRBFI
	CAIE	A,"Y"
	JRST	NODELS
	MOVEI	A,XSIZE+SPECS		;delete all ptrs to old stories
	MOVEM	A,INDEX			;UNDUN ptr
	MOVEM	A,INDEX+1		;NEW ptr
	MOVE	B,[1,,4000]
	MOVEM	B,INDEX+1(A)
	SETZM	INDEX+2(A)		;CLEAR SEQ NBR

	MOVEI	A,SPECS
	MOVEM	A,INDEX+2		;OLD ptr
	MOVE	B,[10,,4000]
	MOVEM	B,INDEX+1(A)
	SETZM	INDEX+2(A)		;CLEAR SEQ NBR

	SETZM	INDEX+3			;POINTER TO END OF NEWS FILE
	JRST	WRITEF

NODELS:	OUTSTR	[ASCIZ /
RECATAGORIZE ALL STORIES? /]
	INCHRW	A
	OUTSTR	[ASCIZ /
/]
	ANDI	A,137			;CONVERT TO UPPER CASE
	CLRBFI
	CAIE	A,"Y"
	JRST	ANYCAT
	MOVE	A,INDEX+2		;OLD ptr
	MOVEM	A,INDEX			;UNDUN ptr.  make all stories undun
	JRST	WRITEF

ANYCAT:	OUTSTR	[ASCIZ /
CATEGORIZE RECENT STORIES? /]
	INCHRW	A
	OUTSTR	[ASCIZ /
/]
	ANDI	A,137
	MOVE	B,INDEX+1		;NEW
	CAIE	A,"Y"
	MOVEM	B,INDEX			;UNDUN
	CLRBFI

WRITEF:	OPEN	2,DSK17
	JRST	DSFAIL
	SETZM	DICTF+1
	SETZM	DICTF+2
	SETZM	DICTF+3
	ENTER	2,DICTF
	ERRMSG	{ENTER FAILED: DICT}
	OUT	2,DCMD
	JRST	.+2
	ERRMSG	{OUT UUO FAILED: DICT}

	OPEN	3,DSK17
	JRST	DSFAIL
	SETZM	LINKSF+1
	SETZM	LINKSF+2
	SETZM	LINKSF+3
	ENTER	3,LINKSF
	ERRMSG	{ENTER FAILED: LINKS}
	OUT	3,LCMD
	JRST	.+2
	ERRMSG	{OUT UUO FAILED: LINKS}

	OUT	1,XCMD
	JRST	.+2
	ERRMSG	{OUT UUO FAILED: INDEX}

	RELEAS	3,
	RELEAS	2,
	RELEAS	1,

	JRST	DONE

	END	M